"""
Дополнительный простой модуль браков для контроля чатов.

- Информация о браке: кто, с кем, дата, сколько в браке.
- Входище исходящие завки на брак.
- Пользователь отпраляет запрос на брак, запрос "живёт" 5 минут.
- Второй пользователь должен принять его за 5 минут.
  * При одной входящей заявке заключается брак.
  * При более чем одной заявке, нужно выбрать с кем заключается брак.
- Список браков беседы: кто, с кем, сколько, дата свадьбы.
- Для развода нужно написать команду и код подтверждения. (случайно не выйдет)

Author: Milinuri Nirvalen
"""

from chiori import Plugin
from libs.chat_control import get_chat
from libs.chat_control import get_str_time
from libs.utils import gen_code
from libs.vk import args
from libs.vk import get_id
from libs.vk import get_profiles

import time


p = Plugin(name='чат: браки', backend='vk',
	desc='браки для ваших бесед',
	args={
		'target':args['target'],
		'accept':'принять; accept; a; y'
	})

helptext = f'''/брак - посмотреть информацию о браке
/брак <target> - отправить заявку на брак / принять заявку от...
/брак <acсept> - принять входящую заявку на брак'''


# func
# ====

def check_request(c, target):
	# проверка заявок на брак
	if target in c["m_requests"]:
		return list(c["m_requests"][target].keys())
	else:
		return []

def check_marriage(c, target):
	# проверка на наличие бпака
	for m in c['marriages']:
		if target in m['members']:
			return m

def sent_requests(c, target):
	res = []
	for k, v in c['m_requests'].items():
		if target in v.keys():
			res.append(k)
	return res


def accept_request(c, target, uid):
	# принять заявку на бравк
	if check_marriage(c.file_data, target):
		return 'пользователь уже состоит в браке.'

	del c.file_data['m_requests'][uid][target]
	c.file_data['marriages'].append(
		{'members':[target, uid], 'date':int(time.time()), 'code':gen_code(6)})

	c.save()
	return f'заявка на брак от {target} была принята'


# commands
# ========

@p.command('брак', 'marriage',
	usage='[target/accept] информация о браке; подать/принять заявку на брак',
	check_func={'check_chat':0}, else_func='chioNotAdmin')
async def request(event, ctx):
	c = get_chat(event)
	target, _ = await get_id(event, ctx)
	uid = str(event.get('from.id'))
	profiles = event.get('to.profiles')
	m = check_marriage(c.file_data, uid)

	if not ctx.sargs and not target:
		if m:

			name_1 = profiles[m['members'][0]]["name"]
			name_2 = profiles[m['members'][1]]["name"]

			text = f'''информация о браке:
❤ {name_1} и {name_2}
📅 свадьба: {time.ctime(m["date"])}
🕰 в браке: {get_str_time(ctx.now-m["date"])}
⚠ для развода: "/развод {m["code"]}"'''

		else:
			text = f'❤ вы не состоите в браке.'

		rq = check_request(c.file_data, uid)
		if rq:
			text += f'\n\n💌 входящие заявки на брак ({len(rq)}):'
			for x in rq:
				text += f'\n-- [{x}] [id{x}|{profiles[x]["name"]}]'
		else:
			text += f'\n\n💌 нет входящих заявок на брак'

		sr = sent_requests(c.file_data, uid)
		if sr:
			text += f'\n\n📩 исходящие заявки на брак ({len(sr)}):'
			for x in sr:
				text += f'\n-- [{x}] [id{x}|{profiles[x]["name"]}]'
		else:
			text += f'\n📩 нет исходящие заявок на брак'

		await ctx.message(text)

	elif ctx.sargs in ['принять', 'acсept', 'a', 'y']:
		rq = check_request(c.file_data, uid)

		if len(rq) == 1:
			await ctx.message(accept_request(c, rq[0], uid))

		else:
			text = f'\n\nвходящие заявки на брак ({len(rq)}):'
			for x in rq:
				text += f'\n-- [{x}] [id{x}|{profiles[x]["name"]}]'
			await ctx.message(text)

	elif target in check_request(c.file_data, uid):
		await ctx.message(accept_request(c, target, uid))

	elif target in profiles and target != uid:
		if target not in c.file_data["m_requests"]:
			c.file_data["m_requests"][target] = {uid:ctx.now}
		else:
			c.file_data["m_requests"][target][uid] = ctx.now

		c.save()

		await ctx.message(f'''вы создали заявки на брак с [id{target}|{profiles[target]["name"]}].
Для подтверждения брака пропишите:
-- /брак ({uid}; {args["target"]})
-- /брак принять (если это единственная заявка)''')

	else:
		await ctx.message('пожалуйста, укажите цель.')


@p.command('браки', usage='браки в беседе',
	check_func={'check_chat':0}, else_func='chioNotAdmin')
async def marrtages(event, ctx):
	c = get_chat(event).file_data
	if c['marriages']:
		text = f'браки беседы ({len(c["marriages"])} шт.):'
		ids = []

		for m in c["marriages"]:
			ids.append(m["members"][0])
			ids.append(m["members"][1])

		profiles = await get_profiles(event, ctx, ids)

		for m in sorted(c["marriages"], key=lambda x: x["date"]):
			date = get_str_time(ctx.now-m['date'])

			pr1 = profiles[m["members"][0]]
			pr2 = profiles[m["members"][1]]

			text += f'\n-- {pr1["name"]} и {pr2["name"]} ({date})'
	else:
		text = f'в беседе нету браков.'

	await ctx.message(text)


@p.command('развод', usage='<code> распустить брак',
	check_func={'check_chat':0}, else_func='chioNotAdmin')
async def divorce(event, ctx):
	c = get_chat(event)
	uid = str(event.get('from.id'))

	m = check_marriage(c.file_data, uid)
	members = await get_profiles(event, ctx, m['members'])
	if m:
		if ctx.sargs and ctx.sargs == m['code']:
			name_1 = f'[id{m["members"][0]}|{members[m["members"][0]]["name"]}]'
			name_2 = f'[id{m["members"][1]}|{members[m["members"][1]]["name"]}]'
			c.file_data["marriages"].remove(m)
			c.save()

			await ctx.message(f'{name_1} и {name_2} развелись.')
		else:
			await ctx.message(f'Если вы действительно хотите расторгнуть брак пропишите:\n/развод {m["code"]}')
	else:
		await ctx.message('вы не находитесь в браке.')
